package produto.manager;

import geral.manager.GenericManager;
import geral.manager.UtilManager;
import geral.util.FacesUtil;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import javax.ejb.EJB;
import javax.enterprise.context.ConversationScoped;
import javax.inject.Inject;
import javax.inject.Named;

import br.com.sgc.entities.produto.ProdutoFinal;
import br.com.sgc.entities.produto.TipoProduto;
import br.com.sgc.exception.ValidacaoException;
import br.com.sgc.session.ProdutoFinalSession;

/**
 * Classe responsável por gerenciar os 
 *os objetos do tipo produto.
 *Responsável por controlar  as requisições 
 *vindas da tela e repassando as funções para 
 *as classes de negócio
 * @author stevens
 *
 */


@Named
@ConversationScoped
public class ProdutoManager extends GenericManager implements Serializable{

	private static final long serialVersionUID = 1915356028214713815L;
	
	private ProdutoFinal produto = new ProdutoFinal();
	private List<ProdutoFinal> listProdutos = new ArrayList<ProdutoFinal>(); 
	private List<TipoProduto> listTipoProduto = new ArrayList<TipoProduto>();
	private Boolean showPanelCadastro = false;
	
	@EJB 
	private  ProdutoFinalSession produtoSession;	
	
	@Inject
	private UtilManager utilManager; 
	
	
	
	//----------------------------------------------------CRUDS----------------------------------------------------
	/**
	 * Método que carrega a lista inicial de produtos na tela
	 * @return
	 */
	public String list() {		
		showPanelCadastro = false;
		listProdutos = produtoSession.findAll(ProdutoFinal.class, utilManager.getSegurancaManager().getUsuarioLogado().getClinica().getId(),true);
		return "formProduto";
	}
	
	
	public String prepareSave() {
		showPanelCadastro = true;
		listTipoProduto = utilManager.getTipoProdutoManager().getTipoProdutoSession().findAll(TipoProduto.class,utilManager.getSegurancaManager().getUsuarioLogado().getClinica().getId());
		produto = new ProdutoFinal();
		produto.setClinica(utilManager.getSegurancaManager().getUsuarioLogado().getClinica());
		return "formProduto";
	}

	public String save(){		
		try {
			produtoSession.save(produto);
			return list();
		} catch (ValidacaoException e) {
			e.printStackTrace();
		}
		return null;
	}
	
	
	public String prepareUpdate() {
		showPanelCadastro = true;
		produto = produtoSession.findById(ProdutoFinal.class, produto.getId(),true);
		produto.setTipoProduto(utilManager.getTipoProdutoManager().getTipoProdutoSession().findById(TipoProduto.class, produto.getTipoProduto().getId()));
		produto.setClinica(utilManager.getSegurancaManager().getUsuarioLogado().getClinica());
		listTipoProduto = utilManager.getTipoProdutoManager().getTipoProdutoSession().findAll(TipoProduto.class,utilManager.getSegurancaManager().getUsuarioLogado().getClinica().getId());
		return "formProduto";
	}
	
	
	
	public String update() {
		try {			
			produtoSession.update(produto);
			FacesUtil.mensInfo("Produto Cadastrado com sucesso");
			return list();
		} catch (Exception e) {
			FacesUtil.mensWarn(e.getMessage());
			e.printStackTrace();
			}		
		return null;		
	}
	
	
	public String  delete() {
		produto = produtoSession.findById(ProdutoFinal.class, produto.getId(),true);
		produto.setDeletado(true);
		try {
			produtoSession.update(produto);
			FacesUtil.mensInfo("Produto deletado com sucesso");
			return list();
		} catch (Exception e) {
			FacesUtil.mensInfo(e.getMessage());
			e.printStackTrace();
		}
		return null;
	}
	
	
	
	//----------------------------------------------------------------------Gets e Setters----------------------------------------------------------------------
	public List<ProdutoFinal> getListProdutos() {
		return listProdutos;
	}


	public void setListProdutos(List<ProdutoFinal> listProdutos) {
		this.listProdutos = listProdutos;
	}


	public void setProduto(ProdutoFinal produto) {
		this.produto = produto;
	}


	public ProdutoFinal getProduto() {
		return produto;
	}


	public ProdutoFinalSession getProdutoSession() {
		return produtoSession;
	}


	public void setProdutoSession(ProdutoFinalSession produtoSession) {
		this.produtoSession = produtoSession;
	}


	public List<TipoProduto> getListTipoProduto() {
		return listTipoProduto;
	}


	public void setListTipoProduto(List<TipoProduto> listTipoProduto) {
		this.listTipoProduto = listTipoProduto;
	}


	public Boolean getShowPanelCadastro() {
		return showPanelCadastro;
	}


	public void setShowPanelCadastro(Boolean showPanelCadastro) {
		this.showPanelCadastro = showPanelCadastro;
	}
	
}
